package com.awg.controller;

import com.awg.vo.User;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * 用户控制器
 *
 * @author awg
 * @date 2020-02-22
 * @version 1.0
 */
@Controller
@RequestMapping(value = "u")
public class UserController {

	/**
	 * 用户登录
	 * @param u 用户对象
	 * @return 用户登录结果
	 */
	@PostMapping(value = "/subLogin", produces = {"application/json;charset=UTF-8"})
	@ResponseBody
	public String subLogin(User u) {
		Subject subject = SecurityUtils.getSubject();
		UsernamePasswordToken token = new UsernamePasswordToken(u.getUsername(), u.getPassword());
		try {
			subject.login(token);
		} catch (AuthenticationException e) {
			// e.printStackTrace();
			return "登录失败, 用户名或者密码错误。-- " + e.getMessage();
		}
		if (subject.hasRole("admin")) {
			return "登录成功, 具有admin权限";
		}
		return "登录成功-无admin权限";
	}

	/* @RequiresRoles 当前的主体具有指定的角色才能访问 */
	/**
	 * 用户角色测试 - admin角色测试
	 * @return 测试结果
	 */
	@RequiresRoles("admin")
	@GetMapping(value = "/testRoles")
	@ResponseBody
	public String testRoles() {
		return "testRoles(admin) SUCCESS";
	}

	/**
	 * 用户角色测试 - superadmin角色测试
	 * @return 测试结果
	 */
	@RequiresRoles("superadmin")
	@GetMapping(value = "/testRoles0")
	@ResponseBody
	public String testRoles0() {
		return "testRoles(superadmin) SUCCESS";
	}

	/* @RequiresPermissions 当前的主体具有指定的权限才可访问 */
	/**
	 * 用户权限测试 - admin角色权限测试
	 * @return 测试结果
	 */
	@RequiresPermissions({"user:add", "user:delete", "user:update", "user:select"})
	@GetMapping(value = "/testPermissions")
	@ResponseBody
	public String testPermissions() {
		return "testPermissions(admin) SUCCESS";
	}

	/**
	 * 用户权限测试（过滤器的方式） - "admin:add", "admin:delete"
	 * @return 测试结果
	 */
	@GetMapping(value = "/testPermissionsByFilter")
	@ResponseBody
	public String testPermissionsByFilter() {
		return "testPermissionsByFilter(superadmin - permissions) SUCCESS";
	}

	/**
	 * 用户权限测试（过滤器的方式） - "admin:add", "data:select"
	 * @return 测试结果
	 */
	@GetMapping(value = "/testPermissionsByFilter2")
	@ResponseBody
	public String testPermissionsByFilter2() {
		return "testPermissionsByFilter2(superadmin or user - permissions) SUCCESS";
	}

	/**
	 * 用户角色测试（过滤器的方式） - superadmin角色测试
	 * @return 测试结果
	 */
	@GetMapping(value = "/testRolesByFilter")
	@ResponseBody
	public String testRolesByFilter() {
		return "testRolesByFilter(superadmin) SUCCESS";
	}

	/**
	 * 用户角色测试（过滤器的方式） - admin角色测试
	 * @return 测试结果
	 */
	@GetMapping(value = "/testRolesByFilter2")
	@ResponseBody
	public String testRolesByFilter2() {
		return "testRolesByFilter2(admin) SUCCESS";
	}

	/**
	 * 用户角色测试（自定义过滤器的方式） - superadmin或admin角色测试
	 * @return 测试结果
	 */
	@GetMapping(value = "/testRolesBySelfFilter")
	@ResponseBody
	public String testRolesBySelfFilter() {
		return "testRolesBySelfFilter(superadmin or admin) SUCCESS";
	}

}
